.TH "md_docs_2quick__start_2_x_e4_x_b8_x_a_d_x_e6_x96_x87_203_8getting__start" 3 "common_util" \" -*- nroff -*-
.ad l
.nh
.SH NAME
md_docs_2quick__start_2_x_e4_x_b8_x_a_d_x_e6_x96_x87_203_8getting__start \- 
.IP "1." 4
快速指引 
.PP

.PP
 
.SH "1\&.1\&. 概述"
.PP
common_util是C++的一个通用工具库，采用现代C++语法（C++11及以上）实现，使用cutl作为命名空间，所有接口的命名方式与STL保持一致，可以作为STL库的一个补充，你可以像使用STL一样使用common_util。
.SH "1\&.2\&. 目录结构"
.PP
.PP
.nf
\&./common_util
├── build                       # 程序构建时的缓存目录
├── docs                        # 文档目录
│   ├── quick_start             # 快速指引文档
│   └── reference               # API接口文档
├── publish                     # 发布目录, release方式构建时会存放构建的最终结果
│   ├── common_util             # 发布的common_util库
│   │   ├── include             # 发布的common_util头文件目录
│   │   └── lib                 # 发布的common_util静态库
│   └── common_util_demo        # 发布的common_util_demo可执行程序
├── script                      # 脚本目录
└── src                         # 源代码目录
    ├── common_util             # common_util源码目录
    └── usage_demo              # common_util_demo源码目录
.fi
.PP
.SH "1\&.3\&. 使用方式"
.PP
简单的几个步骤如下：
.PP
.RS 4
1\&. 包含 \fBcommon_util\&.h\fP 头文件
.IP "2." 4
库的初始化，注册日志打印的回调函数
.IP "3." 4
库的使用 
.PP
.RE
.PP
具体样例如下：
.PP
.PP
.nf
 ++
#pragma once

#include <iostream>
#include <map>
#include <mutex>
#include <thread>
#include "common_util\&.h"

std::string loglevel2flag(cutl::loglevel level)
{
    static std::map<cutl::loglevel, std::string> levelMap = {
        {cutl::loglevel::debug_level, "[D]"},
        {cutl::loglevel::info_level, "[I]"},
        {cutl::loglevel::warn_level, "[W]"},
        {cutl::loglevel::error_level, "[E]"},
    };
    auto itr = levelMap\&.find(level);
    if (itr != levelMap\&.end())
    {
        return itr\->second;
    }
    return "[?]";
}

static std::mutex g_log_mtx_;
void static library_log_func(cutl::loglevel level, const std::string &msg)
{
    std::lock_guard<std::mutex> lock(g_log_mtx_);
    auto curTime = cutl::fmt_timestamp_ms(cutl::timestamp(cutl::timeunit::ms));
    auto threadId = std::this_thread::get_id();
    if (cutl::loglevel::error_level == level)
    {
        std::cerr << "[" << curTime << "]" << loglevel2flag(level) << "]" << threadId << "](cutl) " << msg << std::endl;
    }
    else if (cutl::loglevel::debug_level == level)
    {
        //  print debug log
    }
    else
    {
        std::cout << "[" << curTime << "]" << loglevel2flag(level) << "]" << threadId << "](cutl) " << msg << std::endl;
    }
}

int main(int argc, char *argv[])
{
    // 库的初始化
    cutl::library_init(library_log_func);

    // 数据格式化
    std::cout << "fmt_uint: " << cutl::fmt_uint(12, 5) << std::endl;
    std::cout << "fmt_double: " << cutl::fmt_double(3\&.141592653, 4) << std::endl;
    std::cout << "fmt_filesize: " << cutl::fmt_filesize(33600) << std::endl;
    // 获取系统当前时间
    auto now = cutl::datetime::now();
    std::cout << "current time(UTC time): " << now\&.utctime() << std::endl;
    std::cout << "current time(local time): " << now\&.format() << std::endl;

    return 0;
}
.fi
.PP
.PP
运行结果如下：
.PP
.PP
.nf
[2024\-05\-18 16:01:03\&.477][I]]0x7ff844a9b100](cutl) [config\&.cpp:39:library_init] common_util library initialized, version:1\&.0\&.0
fmt_uint: 00012
fmt_double: 3\&.1416
fmt_filesize: 32\&.8K
current time(UTC time): 2024\-05\-18 08:01:03\&.478
current time(local time): 2024\-05\-18 16:01:03\&.478
.fi
.PP
.SH "1\&.4\&. Demo"
.PP
src/usage_demo 有各个模块的使用示例。
.PP
.PP
.nf
config\&.hpp      # 初始化配置
datetime\&.hpp    # 日期时间类的使用
filepath\&.hpp    # 文件路径类的使用
fileutil\&.hpp    # 文件系统相关的操作
strfmt\&.hpp      # 字符串格式化
strutil\&.hpp     # 字符串相关的操作
sysutil\&.hpp     # 系统调用相关的操作
timecount\&.hpp   # 函数计时器类
timeutil\&.hpp    # 时间相关的操作
verutil\&.hpp     # 版本号相关的操作
.fi
.PP
 
